package com.example.activemq;
import java.time.Instant;

import javax.jms.Destination;
import javax.jms.Queue;

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * 消息生产者 
 *
 */

//CommandLineRunner :项目服务启动的时候就去加载一些数据或做一些事情这样的需求。
//Spring Boot应用程序在启动后，会遍历CommandLineRunner接口的实例并运行它们的run方法。
//也可以利用@Order注解（或者实现Order接口）来规定所有CommandLineRunner实例的运行顺序。
@Service
public class Producer implements CommandLineRunner {

	/*
	 * Jms消息模板
	 */
	@Autowired 
	private JmsMessagingTemplate jmsMessagingTemplate;
	/**
	 * 队列其实就相当于邮局的邮箱，sample.quene就相当于这个邮箱在哪个地方，我们发消息（任务）时只需要
	 * 指定这个邮箱的地址，和要发的消息内容就行，（相当于把信放进邮箱），然后创建consumer消费者（服务：相当于邮递员）
	 * 会从这个邮箱中把消息（信件）拿走，进行相应处理
	 * quene:只能让一个消费者拿走（A拿走了，这个信就没了），当消息过多时，避免队列堆积过多的消息，可以多开消费者（服务）共同处理
	 * 消息（分布式消息处理）
	 * topic:每一个消费者都能拿到，拿到消息后可以对详消息行不同的处理，比如聊天，创建两个消费者，一个用于
	 * 把消息发送给接受者，另一个用于把消息保存起来
	 * 
	 * 
	 * 
	 */
	private Destination destination = new ActiveMQQueue("sample.queue");

	//声明topic队列
	private Destination destination2 = new ActiveMQTopic("msg.topics.demo");

	private Destination destination3 = new ActiveMQTopic("msg.topics.demo2");
	
	/*
	 * 队列
	 */
	@Autowired 
	private Queue queue;
	
	/*
	 * quene发送消息
	 */
	public void send(String msg){
		this.jmsMessagingTemplate.convertAndSend(destination, msg);
	}
	/*
	 * Topic发送消息
	 * 消息队列可接受的参数形式为String,array[],Map<String,?>
	 */
	public void send2(String msg){
		this.jmsMessagingTemplate.convertAndSend(destination2, msg);
	}
	
	
	
	@Override
	public void run(String... arg0) throws Exception {
		 send("Sample message");
		 //无论有多少消息进入队列，都会转发给每一个订阅者
		 for(int i = 0;i<10;i++){
			 //send2("我是topic"+i);
		 }
		
	        System.out.println("Message was sent to the Queue");
		
	}
	
	@JmsListener(destination = "return.queue")//接收消费者的反馈,可以不要
    public void receivingMsg(String content){
        System.out.println(Instant.now().getEpochSecond() + " -Receiving a message : " +  content);
    }



	
}